#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void init_daemon(void) {
    pid_t pid;

    // 1. 创建子进程，父进程退出
    pid = fork();
    if (pid < 0) {
        perror("fork failed");
        exit(1);
    } else if (pid > 0) {
        exit(0); // 父进程退出
    }

    // 2. 创建新会话，子进程成为会话首进程
    if (setsid() < 0) {
        perror("setsid failed");
        exit(1);
    }

    // 3. 更改工作目录为根目录
    if (chdir("/") < 0) {
        perror("chdir failed");
        exit(1);
    }

    // 4. 重设文件权限掩码
    umask(0);

    // 5. 关闭不必要的文件描述符
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 6. 守护进程进入主循环，执行任务
    while (1) {
        // 在此处执行守护进程的具体任务
        // 例如定时记录日志、处理某些服务请求等

        // 这里简单模拟每隔30秒输出一行日志到文件
        FILE *fp = fopen("/tmp/daemon.log", "a");
        if (fp) {
            fprintf(fp, "守护进程正在运行: %ld\n", time(NULL));
            fclose(fp);
        }
        
        // 睡眠30秒
        sleep(30);
    }
}

int main() {
    // 初始化并创建守护进程
    init_daemon();

    // 主程序不再需要任何操作，守护进程在后台运行
    return 0;
}